package com.ms.orm.util;

import com.ms.common.util.ReflectUtils;
import com.ms.orm.context.DefaultLittleOrmContext;
import com.ms.orm.meta.EntityAndTableInfo;
import com.ms.orm.meta.PrimaryKey;
import com.ms.orm.meta.PropertyAndColumnInfo;

/**
 * @author zdh
 * 元数据操作, 只适合 被@TableName 注释的实体类 操作
 */
public class MetaDataOperator {

    private static DefaultLittleOrmContext defaultLittleOrmContext = DefaultLittleOrmContext.getDefaultLittleOrmContext();

    /**
     * 根据 entityClass 获取 id java属性字段
     */
    public static Object getEntityIdPropertyName(Class<?> entityClass){
        PrimaryKey primaryKey = defaultLittleOrmContext.getEntityAndTableInfo(entityClass).getPrimaryKey();
        return  primaryKey!=null ? primaryKey.getPropertyName():null;
    }

    /**
     * 根据 entityClass 获取 id数据库属性字段
     */
    public static Object getEntityIdColumnName(Class<?> entityClass){
        PrimaryKey primaryKey = defaultLittleOrmContext.getEntityAndTableInfo(entityClass).getPrimaryKey();
        return  primaryKey!=null ? primaryKey.getColumnName():null;
    }

    /**
     * 根据 entityClass 获取 id数据库属性字段
     */
    public static EntityAndTableInfo getEntityAndTableInfo(Class<?> entityClass){
        return defaultLittleOrmContext.getEntityAndTableInfo(entityClass);
    }


    /**
     * 根据实体对象 和 实体属性名 获取属性值
     * @param entity
     * @param propertyName
     * @return
     */
    public static Object getProperValue(Object entity,String propertyName){
        return ReflectUtils.invokeMethod(getPropertyAndColumnInfo(entity.getClass(),propertyName).getPropertyReadMethod(),entity);
    }

    /**
     * 根据实体对象 和 实体属性名 获取属性值
     * @param entity
     * @param propertyName
     * @param values
     * @return
     */
    public static Object setProperValue(Object entity, String propertyName, Object... values){
        return ReflectUtils.invokeMethod(getPropertyAndColumnInfo(entity.getClass(),propertyName).getPropertyWriterMethod(),entity,values);
    }

    /**
     * 根据数据库列字段 获取 字段映射对象
     * @param entityClass
     * @param columnName
     * @return
     */
    public static PropertyAndColumnInfo getPropertyAndColumnInfo(Class entityClass, String columnName){
        return getEntityAndTableInfo(entityClass).getColumnMap().get(columnName);
    }

}
